package com.javaclimb.music.controller;

import com.javaclimb.music.domain.Song;
import com.javaclimb.music.service.SongService;
import com.javaclimb.music.utils.PageUtils;
import com.javaclimb.music.utils.R;
import com.javaclimb.music.vo.SongVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;

/**
 * @author 夏天
 * @date 2020年11月23日 8:28
 */
@Slf4j
@RestController
@RequestMapping("/song")
@Api(tags = "歌手歌曲")
public class SongController {
    @Autowired
    SongService songService;


    @ApiOperation("删除歌曲")
    @PostMapping("/delete")
    public R deleteSong(@RequestBody Integer[] ids) {
        //-TODO 先查询到数据库中对应的文件地址，删除掉它再进行下面的代码
        if (songService.removeByIds(Arrays.asList(ids))) {
            return R.ok();
        }
        return R.error("删除歌曲失败");
    }

    @ApiOperation("获取歌曲信息")
    @GetMapping("/info/{id}")
    public R getSong(@PathVariable("id") Integer id) {
        Song singer = songService.getById(id);
        if (singer != null) {
            return R.ok().put("info", singer);
        }
        return R.error("获取歌曲信息失败");
    }

    @ApiOperation("获取所以歌曲信息")
    @GetMapping("/list")
    public R listSong(@RequestParam Map<String, Object> params) {
        PageUtils pageUtils = songService.queryPage(params);
        return R.ok().put("data", pageUtils);
    }

    @ApiOperation("添加歌曲")
    @PostMapping("/add")
    public Object addSong(@RequestParam("file") MultipartFile mpFile, SongVo songVo) {
        if (mpFile == null || mpFile.isEmpty()) {
            return R.error("歌曲上传失败");
        }
        //获取前端传来的参数

        String pic = "/img/songPic/tubiao.jpg";                     //默认图片
        songVo.setPic(pic);
        //文件名=当前时间到毫秒+原来的文件名
        String fileName = System.currentTimeMillis() + mpFile.getOriginalFilename();
        //文件路径
        String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "song";
        //如果文件路径不存在，新增该路径
        File file1 = new File(filePath);
        if (!file1.exists()) {
            file1.mkdirs();
        }
        //实际的文件地址
        File dest = new File(filePath + System.getProperty("file.separator") + fileName);
        //存储到数据库里的相对文件地址
        String storeUrlPath = "/song/" + fileName;
        Song song = new Song();
        BeanUtils.copyProperties(songVo, song);
        song.setUrl(storeUrlPath);
        try {
            mpFile.transferTo(dest);
            boolean flag = songService.save(song);
            if (flag) {
                R.ok("添加歌曲成功").put("avator", storeUrlPath);
                return R.ok("保存歌曲成功");
            }
            return R.error("保存歌曲出错");
        } catch (IOException e) {
            log.error("保存歌曲出错", e);
            return R.error("保存歌曲出错");
        }
    }

    @ApiOperation("修改歌曲信息")
    @PostMapping("/update")
    public R updateSong(@RequestBody SongVo songVo) {
        Song singer = new Song();
        BeanUtils.copyProperties(songVo, singer);
        if (songService.updateById(singer)) {
            return R.ok();
        }
        return R.error("修改歌曲信息失败");
    }

    /**
     * 更新歌曲图片
     */
    @ApiOperation("更新歌曲图片")
    @RequestMapping(value = "/updateSongPic", method = RequestMethod.POST)
    public Object updateSongPic(@RequestParam("file") MultipartFile avatorFile, @RequestParam("id") int id) {
        if (avatorFile == null || avatorFile.isEmpty()) {
            return R.error("更新歌曲图片失败");
        }
        //文件名=当前时间到毫秒+原来的文件名
        String fileName = System.currentTimeMillis() + avatorFile.getOriginalFilename();
        //文件路径
        String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "img"
                + System.getProperty("file.separator") + "songPic";
        //如果文件路径不存在，新增该路径
        File file1 = new File(filePath);
        if (!file1.exists()) {
            file1.mkdirs();
        }
        //实际的文件地址
        File dest = new File(filePath + System.getProperty("file.separator") + fileName);
        //存储到数据库里的相对文件地址
        String storeAvatarPath = "/img/songPic/" + fileName;
        try {
            avatorFile.transferTo(dest);
            Song song = new Song();
            song.setId(id);
            song.setPic(storeAvatarPath);
            boolean flag = songService.updateById(song);
            if (flag) {
                return R.ok("更新歌曲图片成功");
            }
            return R.ok("更新歌曲图片失败");
        } catch (IOException e) {
            log.error("更新歌曲图片成功", e);
            return R.ok("更新歌曲图片成功");
        }
    }


    /**
     * 更新歌曲
     */
    @ApiOperation("更新歌曲")
    @RequestMapping(value = "/updateSongUrl", method = RequestMethod.POST)
    public Object updateSongUrl(@RequestParam("file") MultipartFile avatorFile, @RequestParam("id") int id) {
        if (avatorFile == null || avatorFile.isEmpty()) {
            return R.error("歌曲上传失败");
        }
        //文件名=当前时间到毫秒+原来的文件名
        String fileName = System.currentTimeMillis() + avatorFile.getOriginalFilename();
        //文件路径
        String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "song";
        //如果文件路径不存在，新增该路径
        File file1 = new File(filePath);
        if (!file1.exists()) {
            file1.mkdir();
        }
        //实际的文件地址
        File dest = new File(filePath + System.getProperty("file.separator") + fileName);
        //存储到数据库里的相对文件地址
        String musicUrl = "/song/" + fileName;
        try {
            avatorFile.transferTo(dest);
            Song song = new Song();
            song.setId(id);
            song.setUrl(musicUrl);
            boolean flag = songService.updateById(song);
            if (flag) {
                return R.ok("更新歌曲成功");
            }
            return R.ok("更新歌曲失败");
        } catch (IOException e) {
            log.error("更新歌曲失败", e);
            return R.ok("更新歌曲失败");
        }
    }

    /**
     * 查询歌曲数量
     */
    @GetMapping(value = "/allSong")
    public R allSong() {

        int count = songService.count();
        return R.ok().put("data", count);
    }
}
